﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Core;

namespace Tools
{
    class ToolsProgram
    {
        static void Main(string[] args)
        {
            zipBase64(args[0]+".txt", null, args);
        }

        public static void zipBase64(string outPathname, string password, String[] contents)
        {
            //FileStream fsOut = File.Create(outPathname);
            MemoryStream fsOut = new MemoryStream();
            if (!contents[0].EndsWith(".zip"))
            {
                ZipOutputStream zipStream = new ZipOutputStream(fsOut);

                zipStream.SetLevel(3); //0-9, 9 being the highest level of compression

                zipStream.Password = password;	// optional. Null is the same as not setting.

                foreach (string filename in contents)
                {
                    string entryName = ZipEntry.CleanName(filename); // Removes drive from name and fixes slash direction
                    ZipEntry newEntry = new ZipEntry(entryName);
                    newEntry.DateTime = DateTime.Now;

                    // Specifying the AESKeySize triggers AES encryption. Allowable values are 0 (off), 128 or 256.
                    //   newEntry.AESKeySize = 256;

                    // To permit the zip to be unpacked by built-in extractor in WinXP and Server2003, WinZip 8, Java, and other older code,
                    // you need to do one of the following: Specify UseZip64.Off, or set the Size.
                    // If the file may be bigger than 4GB, or you do not need WinXP built-in compatibility, you do not need either,
                    // but the zip will be in Zip64 format which not all utilities can understand.
                    //   zipStream.UseZip64 = UseZip64.Off;

                    newEntry.Size = new FileInfo(filename).Length;

                    zipStream.PutNextEntry(newEntry);

                    // Zip the file in buffered chunks
                    // the "using" will close the stream even if an exception occurs
                    byte[] buffer = new byte[4096];
                    using (FileStream streamReader = File.OpenRead(filename))
                    {
                        StreamUtils.Copy(streamReader, zipStream, buffer);
                    }
                    zipStream.CloseEntry();
                }
                zipStream.IsStreamOwner = true;	// Makes the Close also Close the underlying stream
                zipStream.Close();
            }
            else // zipped file.
            {
                using (FileStream streamReader = File.OpenRead(contents[0]))
                {
                
                        byte[] buffer = new byte[4096];
                        StreamUtils.Copy(streamReader, fsOut, buffer);
                }
                
            }
            //fsOut.Seek(0, SeekOrigin.Begin);
            String s =  System.Convert.ToBase64String(fsOut.ToArray());
            StreamWriter sw = new StreamWriter(outPathname, false, ASCIIEncoding.ASCII);
            sw.WriteLine(s);
            sw.Close();
        }

    }
}
